package com.yungu.swift.autoconfig.oss;

import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author: cuixiuyin
 * @Date: 2019/11/05
 */
@Slf4j
@Configuration
@EnableConfigurationProperties
@ConditionalOnClass({OSSClient.class,})
public class OSSAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public OSSProperties OSSProperties() {
        return new OSSProperties();
    }

    @Bean(destroyMethod = "shutdown")
    @ConditionalOnMissingBean
    public OSSClient OSSClient(OSSProperties prop) {
        ClientConfiguration conf = new ClientConfiguration();
        //设置OSSClient允许打开的最大HTTP连接数，默认为1024个。
        conf.setMaxConnections(prop.getMaxConnections());
        //设置Socket层传输数据的超时时间，默认为50000毫秒。
        conf.setSocketTimeout(prop.getSocketTimeout());
        //设置建立连接的超时时间，默认为50000毫秒。
        conf.setConnectionTimeout(prop.getConnectionTimeout());
        //设置从连接池中获取连接的超时时间（单位：毫秒），默认不超时。
        conf.setConnectionRequestTimeout(prop.getConnectionRequestTimeout());
        //设置连接空闲超时时间。超时则关闭连接，默认为60000毫秒。
        conf.setIdleConnectionTime(prop.getIdleConnectionTime());
        //设置失败请求重试次数，默认为3次。
        conf.setMaxErrorRetry(prop.getMaxErrorRetry());
        return new OSSClient(prop.getEndPoint(), new DefaultCredentialProvider(prop.getAccessKey(), prop.getSecretKey()), conf);
    }

    @Bean
    @ConditionalOnMissingBean
    public OSSPostProcessor OSSPostProcessor(OSSClient client) {
        return new OSSPostProcessor(client);
    }
}
